package com.yangrr.weblog.admin.utils;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @PATH com.yangrr.weblog.admin.utils.ArticleUtils
 * @Author YangRR
 * @CreateData 2025-05-24 13:46
 * @Description:
 */
public class ArticleUtils {

    // 匹配Markdown链接和图片（精确版本）
    // 匹配HTML标签
    private static final Pattern HTML_TAG_PATTERN = Pattern.compile(
            "<\\/?[a-zA-Z][^>]*>",
            Pattern.CASE_INSENSITIVE
    );

    // 修正后的Markdown链接和图片匹配（标准语法）
    private static final Pattern MARKDOWN_LINK_PATTERN = Pattern.compile(
            "!?$$[^$]+]$[^)]+$"
    );

    // 匹配Markdown标题符号（仅移除#和空格）
    private static final Pattern MARKDOWN_HEADER_PATTERN = Pattern.compile(
            "^#{1,6}\\s+",
            Pattern.MULTILINE
    );

    // 匹配英文单词（按空格/标点分词）
    private static final Pattern ENGLISH_WORD_PATTERN = Pattern.compile(
            "[a-zA-Z]+"
    );

    // 匹配中文字符
    private static final Pattern CHINESE_CHAR_PATTERN = Pattern.compile(
            "[\\u4e00-\\u9fa5]"
    );

    public static int getArticleTotalWords(String content) {
        if (StringUtils.isEmpty(content)) {
            return 0;
        }

        // 1. 移除HTML标签
        String noHtml = HTML_TAG_PATTERN.matcher(content).replaceAll("");

        // 2. 移除Markdown链接和图片
        String noMarkdownLinks = MARKDOWN_LINK_PATTERN.matcher(noHtml).replaceAll("");

        // 3. 移除Markdown标题符号（保留文字）
        String noHeaders = MARKDOWN_HEADER_PATTERN.matcher(noMarkdownLinks).replaceAll("");

        // 4. 统计中英文字数
        return countChineseChars(noHeaders) + countEnglishWords(noHeaders);
    }

    // 中文统计（兼容所有Java版本）
    private static int countChineseChars(String text) {
        Matcher matcher = CHINESE_CHAR_PATTERN.matcher(text);
        int count = 0;
        while (matcher.find()) count++;
        return count;
    }

    // 英文统计（兼容所有Java版本）
    private static int countEnglishWords(String text) {
        Matcher matcher = ENGLISH_WORD_PATTERN.matcher(text);
        int count = 0;
        while (matcher.find()) count++;
        return count;
    }

    /**
     * 计算文章阅读时间（分钟）
     * @param totalWords 总字数（中文按字统计，英文按词统计）
     * @return 阅读时间（向上取整，至少1分钟）
     */
    public static int getArticleReadTime(int totalWords) {
        // 默认阅读速度（字/词 每分钟）
        int wordsPerMinute = 200;

        // 计算并向上取整（保证至少1分钟）
        int minutes = (int) Math.ceil((double) totalWords / wordsPerMinute);
        return Math.max(minutes, 1); // 至少返回1分钟
    }
}
